package com.tp2.dominio;

import java.util.ArrayList;
import java.util.List;

public class Ticket {

	private List<Producto> items;
	private List<Descuento> descuentos;
	private MedioDePago medioDePago;
	private CuponDescuento cupon;
	private double subtotal;
	private String estado;
	private TarjetaDescuento tarjetaDescuento;
	private List<CuponDescuento> cuponesGenerados;

	public Ticket() {

		items = new ArrayList<Producto>();
		descuentos = new ArrayList<Descuento>();
		cuponesGenerados = new ArrayList<CuponDescuento>();
		medioDePago = null;
		cupon = null;
		subtotal = 0;
		estado = "abierto";
	}

	public String getEstado() {

		return estado;
	}

	public List<Producto> getItems() {
		return items;
	}

	public void setDescuentos(List<Descuento> descuentos) {
		this.descuentos = descuentos;
	}

	public List<Descuento> getDescuentos() {
		return this.descuentos;
	}

	public void agregarItem(Producto producto) throws Exception {

		if (estado.equalsIgnoreCase("abierto")) {
			items.add(producto);
			subtotal += producto.getPrecio();
		} else {

			throw new Exception("Ticket cerrado");
		}
	}
	
	public CuponDescuento getCupon() {
		return cupon;
	}

	public void setCupon(CuponDescuento cupon) {
		this.cupon = cupon;
	}

	public int getCantidadItems() {

		return items.size();
	}

	public double getSubtotal() {

		return subtotal;
	}

	public double getTotalDescuentos() {

		double total = 0;
		for (Descuento descuento : this.descuentos) {
			total += descuento.getMonto();
		}

		return total;
	}

	public double getTotal() {

		return subtotal - getTotalDescuentos();

	}

	public MedioDePago getMedioDePago() {

		return medioDePago;
	}

	private void setMedioDePago(MedioDePago medioDePago) {
		this.medioDePago = medioDePago;
	}

	public List<CuponDescuento> cerrar(MedioDePago medioDePago, TarjetaDescuento tarjetaDescuento) throws Exception {

		if (getCantidadItems() > 0) {
			estado = "cerrado";
			setMedioDePago(medioDePago);
			setTarjetaDescuento(tarjetaDescuento);
			
			CalculadorDeDescuentos calculador = CalculadorDeDescuentos.getInstance();
			
			this.descuentos.addAll(calculador.aplicarOfertas(this.getCopiaItems(), medioDePago,tarjetaDescuento));
			
			if(cupon != null){
				
				Descuento descuentoCupon = cupon.aplicar(getSubtotal());
				this.descuentos.add(descuentoCupon);
			}
			
			this.cuponesGenerados = calculador.generarCupones(this.getCopiaItems(), medioDePago, tarjetaDescuento);
			
			return cuponesGenerados;
		
					
		} else {

			throw new Exception("Ticket vacio");
		}

	}

	private List<Producto> getCopiaItems() {
		
		List<Producto> productosCopia = new ArrayList<Producto>();
		
		for(Producto producto: getItems()){
			
			productosCopia.add(new Producto(producto));
			
		}
		
		return productosCopia;
	}

	public TarjetaDescuento getTarjetaDescuento() {
		return tarjetaDescuento;
	}

	public void setTarjetaDescuento(TarjetaDescuento tarjetaDescuento) {
		this.tarjetaDescuento = tarjetaDescuento;
	}
	
	public List<ProductoRanking> rankingDeProductos(){
		List<ProductoRanking> productosRanking = new ArrayList<ProductoRanking>();
		for(Producto producto: this.getItems()){
			
			ProductoRanking productoRanking = new ProductoRanking(producto.getCodigo());
			if(productosRanking.contains(productoRanking)){

				int posEncontrada = productosRanking.indexOf(productoRanking);
				if(posEncontrada != -1){
					
					int cantidadActual = productosRanking.get(posEncontrada).getCantidad();
					productosRanking.get(posEncontrada).setCantidad(cantidadActual+1);
				}
				
			}else{
				productosRanking.add(productoRanking);
			}
		}
		return productosRanking;
	}

	public List<CuponDescuento> getCuponesGenerados() {
		return cuponesGenerados;
	}

	public void setCuponesGenerados(List<CuponDescuento> cuponesGenerados) {
		this.cuponesGenerados = cuponesGenerados;
	}

}
